package com.Twenty_Eight;

import java.util.*;

/**
 * 332. 重新安排行程
 * 给你一份航线列表 tickets ，其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
 *
 * 所有这些机票都属于一个从 JFK（肯尼迪国际机场）出发的先生，所以该行程必须从 JFK 开始。如果存在多种有效的行程，请你按字典排序返回最小的行程组合。
 *
 * 例如，行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小，排序更靠前。
 * 假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
 *
 *  
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/reconstruct-itinerary
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * 2022/09/28 08:04
 */

public class Solution332 {

    Deque<String> deque;
    Map<String,Map<String,Integer>> map;

    /**
     * 采用map来储存
     * map的结构为<"出发航班"，<"到达航班"，航班次数>>
     * @param tickets
     * @return
     */
    public List<String> findItinerary(List<List<String>> tickets) {
        map=new HashMap<String, Map<String, Integer>>();
        deque=new LinkedList<>();
        for (List<String> t:tickets)
        {
            Map<String, Integer> temp;
            if (map.containsKey(t.get(0)))
            {
                temp=map.get(t.get(0));
                temp.put(t.get(1),temp.getOrDefault(t.get(1),0)+1);
            }else
            {
                temp=new TreeMap<>();
                temp.put(t.get(1),1);
            }
            map.put(t.get(0),temp);
        }
        deque.add("JFK");
        backtracking(tickets.size());
        return new ArrayList<>(deque);
    }

    /**
     * 采用回溯的方法来进行对航班的搜索
     * @param tickNum
     * @return
     */
    public boolean backtracking(int tickNum){
        if (deque.size()==tickNum+1)
        {
            return true;
        }
        String last=deque.getLast();
        if (map.containsKey(last))
        {
            for (Map.Entry<String, Integer> target:map.get(last).entrySet())
            {
                int count=target.getValue();
                if (count>0)
                {
                    deque.add(target.getKey());
                    target.setValue(count-1);
                    if (backtracking(tickNum)) return true;
                    deque.removeLast();
                    target.setValue(count);
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Solution332 solution332=new Solution332();
        List<List<String>> list=new ArrayList<>();
        System.out.println();
    }
}
//{"JFK","SFO"},{"JFK","ATL"},{"SFO","ATL"},{"ATL","JFK"},{"ATL","SFO"}